﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CityGames
{
    public partial class FormJuegosGestion : Form
    {
        static private Juego juego = new Juego();
        static private Genero genero = new Genero();
        static private Plataforma plataforma = new Plataforma();

        private FormContenedor contenedor;
        private const int numeroDeJuegosPorPagina = 12;
        private int numeroDePaginaActual;
        private int numeroDePaginasMaximo;

        private DataSet dsJuegos;

        public FormJuegosGestion()
        {
            InitializeComponent();
        }

        private void FormJuegosGestion_Load(object sender, EventArgs e)
        {
            try
            {
                contenedor = (FormContenedor)MdiParent;
                dsJuegos = new DataSet();

                numeroDePaginaActual = 1;

                dtpFechaInicio.Value = juego.ObtenerFechaMinima();
                dtpFechaFin.Value = juego.ObtenerFechaMaxima();

                cbGenero.Items.Add("Todos");
                foreach (DataRow row in genero.ObtenerGeneros().Rows)
                {
                    cbGenero.Items.Add(row[0].ToString());
                }
                cbGenero.SelectedItem = cbGenero.Items[0];

                cbPlataforma.Items.Add("Todas");
                foreach (DataRow row in plataforma.ObtenerPlataformas().Rows)
                {
                    cbPlataforma.Items.Add(row[0].ToString());
                }
                cbPlataforma.SelectedItem = cbPlataforma.Items[0];

                CargarDataGridViewJuegos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han producido los siguientes errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bGestionarCopias_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgvJuegos.SelectedRows.Count == 1)
                {
                    contenedor.hijoFormJuegosGestionCopias.RellenarConDatosDeJuego(dgvJuegos.SelectedRows[0].Cells[0].Value.ToString(), dgvJuegos.SelectedRows[0].Cells[1].Value.ToString());
                    contenedor.hijoFormJuegosGestionCopias.Focus();
                }
                else
                {
                    MessageBox.Show("Debe seleccionar un juego.    ", "Seleccione un juego.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bEliminarJuegos_Click(object sender, EventArgs e)
        {
            try
            {
                int juegosEliminados = 0;

                if (dgvJuegos.SelectedRows.Count > 0)
                {
                    if (MessageBox.Show("¿Realmente desea eliminar los juegos seleccionados?", "Confirmar eliminar", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                    {
                        foreach (DataGridViewRow row in dgvJuegos.SelectedRows)
                        {
                            juegosEliminados++;
                            dsJuegos.Tables["JuegosFiltrados"].Rows[row.Index].Delete();
                        }

                        if (ActualizarJuegos())
                        {
                            CargarDataGridViewJuegos();
                            MessageBox.Show(juegosEliminados.ToString() + " juego(s) eliminado(s) correctamente.    ", "Eliminación exitosa.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        else
                        {
                            MessageBox.Show("Ocurrión un error durante la eliminación.    ", "Eliminación fallida.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                }
                else
                {
                    MessageBox.Show("Debe seleccionar almenos un juego.    ", "Seleccionar juegos para eliminar.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bEditar_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgvJuegos.SelectedRows.Count == 1)
                {
                    contenedor.hijoFormJuegosAlta.ModificarDatos(dsJuegos.Tables["JuegosFiltrados"].Rows[dgvJuegos.SelectedRows[0].Index]);
                    contenedor.hijoFormJuegosAlta.Focus();
                }
                else
                {
                    MessageBox.Show("Debe seleccionar un juego.    ", "Seleccione un juego.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bVisualizar_Click(object sender, EventArgs e)
        {
            try
            {
                if (dgvJuegos.SelectedRows.Count == 1)
                {
                    contenedor.hijoFormJuegosAlta.VisualizarDatos(dsJuegos.Tables["JuegosFiltrados"].Rows[dgvJuegos.SelectedRows[0].Index]);
                    contenedor.hijoFormJuegosAlta.Focus();
                }
                else
                {
                    MessageBox.Show("Debe seleccionar un juego.    ", "Seleccione un juego.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bMostrarTodos_Click(object sender, EventArgs e)
        {
            try
            {
                MostrarTodos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void MostrarTodos()
        {
            try
            {
                tbTitulo.Text = "";
                tbTitulo.Focus();
                dtpFechaInicio.Value = juego.ObtenerFechaMinima();
                dtpFechaFin.Value = juego.ObtenerFechaMaxima();
                cbGenero.SelectedItem = cbGenero.Items[0];
                cbPlataforma.SelectedItem = cbPlataforma.Items[0];

                numeroDePaginaActual = 1;

                CargarDataGridViewJuegos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void CargarDataGridViewJuegos()
        {
            try
            {
                numeroDePaginasMaximo = int.Parse(Math.Ceiling(double.Parse(juego.ObtenerNumeroDeJuegosFiltradosPorNombreGeneroPlataformaFechaLanzamiento(tbTitulo.Text, cbGenero.Text, cbPlataforma.Text, dtpFechaInicio.Value, dtpFechaFin.Value).ToString()) / numeroDeJuegosPorPagina).ToString());

                if (numeroDePaginaActual == 0)
                    numeroDePaginaActual = 1;

                if (numeroDePaginaActual > numeroDePaginasMaximo)
                    numeroDePaginaActual = numeroDePaginasMaximo;

                dsJuegos = juego.ObtenerJuegosFiltradosPorNombreGeneroPlataformaFechaLanzamiento(tbTitulo.Text, cbGenero.Text, cbPlataforma.Text, dtpFechaInicio.Value, dtpFechaFin.Value, numeroDeJuegosPorPagina * (numeroDePaginaActual - 1), numeroDePaginaActual * numeroDeJuegosPorPagina);
                dgvJuegos.DataSource = dsJuegos;
                dgvJuegos.DataMember = "JuegosFiltrados";
                lblPaginaDGV.Text = "Página " + numeroDePaginaActual.ToString() + " de " + numeroDePaginasMaximo.ToString();

                if (numeroDePaginaActual <= 1)
                {
                    bDGVPaginaAnterior.Enabled = false;
                    bDGVPrimeraPagina.Enabled = false;
                }
                else
                {
                    bDGVPaginaAnterior.Enabled = true;
                    bDGVPrimeraPagina.Enabled = true;
                }

                if (numeroDePaginaActual == numeroDePaginasMaximo)
                {
                    bDGVPaginaSiguiente.Enabled = false;
                    bDGVUltimaPagina.Enabled = false;
                }
                else
                {
                    bDGVPaginaSiguiente.Enabled = true;
                    bDGVUltimaPagina.Enabled = true;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void tbTitulo_TextChanged(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = 1;
                CargarDataGridViewJuegos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void dtpFechaInicio_ValueChanged(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = 1;
                CargarDataGridViewJuegos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void dtpFechaFin_ValueChanged(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = 1;
                CargarDataGridViewJuegos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void cbPlataforma_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = 1;
                CargarDataGridViewJuegos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void cbGenero_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = 1;
                CargarDataGridViewJuegos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVUltimaPagina_Click(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = numeroDePaginasMaximo;
                CargarDataGridViewJuegos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVPaginaSiguiente_Click(object sender, EventArgs e)
        {
            try
            {
                if (numeroDePaginaActual < numeroDePaginasMaximo)
                {
                    numeroDePaginaActual++;
                    CargarDataGridViewJuegos();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVPaginaAnterior_Click(object sender, EventArgs e)
        {
            try
            {
                if (numeroDePaginaActual > 1)
                {
                    numeroDePaginaActual--;
                    CargarDataGridViewJuegos();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void bDGVPrimeraPagina_Click(object sender, EventArgs e)
        {
            try
            {
                numeroDePaginaActual = 1;
                CargarDataGridViewJuegos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void ModificarDatos(DataRow datos)
        {
            try
            {
                dsJuegos.Tables["JuegosFiltrados"].Rows[dgvJuegos.SelectedRows[0].Index]["Nombre"] = datos["Nombre"];
                dsJuegos.Tables["JuegosFiltrados"].Rows[dgvJuegos.SelectedRows[0].Index]["Plataforma"] = datos["Plataforma"];
                dsJuegos.Tables["JuegosFiltrados"].Rows[dgvJuegos.SelectedRows[0].Index]["Genero"] = datos["Genero"];
                dsJuegos.Tables["JuegosFiltrados"].Rows[dgvJuegos.SelectedRows[0].Index]["Sinopsis"] = datos["Sinopsis"];
                dsJuegos.Tables["JuegosFiltrados"].Rows[dgvJuegos.SelectedRows[0].Index]["Caratula"] = datos["Caratula"];
                if (datos["P.Nuevo"] != DBNull.Value)
                    dsJuegos.Tables["JuegosFiltrados"].Rows[dgvJuegos.SelectedRows[0].Index]["P.Nuevo"] = datos["P.Nuevo"];
                else
                    dsJuegos.Tables["JuegosFiltrados"].Rows[dgvJuegos.SelectedRows[0].Index]["P.Nuevo"] = DBNull.Value;
                if (datos["P.2ª Mano"] != DBNull.Value)
                    dsJuegos.Tables["JuegosFiltrados"].Rows[dgvJuegos.SelectedRows[0].Index]["P.2ª Mano"] = datos["P.2ª Mano"];
                else
                    dsJuegos.Tables["JuegosFiltrados"].Rows[dgvJuegos.SelectedRows[0].Index]["P.2ª Mano"] = DBNull.Value;
                dsJuegos.Tables["JuegosFiltrados"].Rows[dgvJuegos.SelectedRows[0].Index]["Tarifa"] = datos["Tarifa"];
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public bool ActualizarJuegos()
        {
            bool resultado = false;

            try
            {
                resultado = juego.ActualizarJuegos(dsJuegos, tbTitulo.Text, cbGenero.Text, cbPlataforma.Text, dtpFechaInicio.Value, dtpFechaFin.Value, numeroDeJuegosPorPagina * (numeroDePaginaActual - 1), numeroDePaginaActual * numeroDeJuegosPorPagina);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return resultado;
        }

        private void dgvJuegos_SelectionChanged(object sender, EventArgs e)
        {
            try
            {
                if (dgvJuegos.SelectedRows.Count == 1)
                {
                    bVisualizar.Enabled = true;
                    bEditar.Enabled = true;
                    bGestionarCopias.Enabled = true;
                }
                else
                {
                    bVisualizar.Enabled = false;
                    bEditar.Enabled = false;
                    bGestionarCopias.Enabled = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
